package com.linkgie.galaxyframework.crypto.spi;

import com.linkgie.galaxyframework.crypto.CryptogramType;

/**
 * 密码数据编解码器；
 * <p>
 * 
 * 一个 {@link BytesCodec} 是针对某一种特定类型的 {@link CryptogramType} 的编解码处理；
 * 
 * @author liso
 *
 * @param <T>
 */
public interface CryptobytesCodec<T extends Cryptobytes> extends BytesCodec<T> {

	/**
	 * 支持的密码数据的种类；
	 * 
	 * @return
	 */
	CryptogramType getCryptogramType();

	/**
	 * 编码原始的密码数据，以字节数组返回编码后的密码数据；
	 * <p>
	 * 
	 * @param rawCryptogramBytes
	 * @return
	 */
	byte[] encodeToBytes(byte[] rawBytes);

	/**
	 * 解析指定的密码数据，返回算法生成的原始数据；
	 * <p>
	 * 
	 * 如果无法识别，则返回 null；
	 * 
	 * @param cryptogramBytes
	 * @param offset
	 * @param length
	 * @return
	 */
	default byte[] decodeInRaw(byte[] cryptogramBytes) {
		return decodeInRaw(cryptogramBytes, 0, cryptogramBytes.length);
	}

	/**
	 * 解析指定的密码数据，返回算法生成的原始数据；
	 * <p>
	 * 
	 * 如果无法识别，则返回 null；
	 * 
	 * @param cryptogramBytes
	 * @param offset
	 * @param length
	 * @return
	 */
	byte[] decodeInRaw(byte[] cryptogramBytes, int offset, int length);

	/**
	 * 解析指定的密码数据，返回算法生成的原始数据；
	 * <p>
	 * 
	 * 如果无法识别，则返回 null；
	 * 
	 * @param cryptogramBytes
	 * @param offset
	 * @param length
	 * @return
	 */
	byte[] decodeInRaw(T cryptogram);
}
